﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.Windows.Forms;
using QL_LichCT.DataLayer;
using System.Data;
using QL_LichCT.PresentationLayer;

namespace QL_LichCT.Utilities
{
    class Methods
    {
        //Lấy giá trị hàm băm (MD5).
        public static string EncodeMD5(string chuoi)
        {
            string str_md5 = "";
            byte[] mang = System.Text.Encoding.UTF8.GetBytes(chuoi);

            using (MD5CryptoServiceProvider my_md5 = new MD5CryptoServiceProvider())
            {
                mang = my_md5.ComputeHash(mang);
                foreach (byte b in mang)
                {
                    str_md5 += b.ToString("X2");
                }
            }

            return str_md5;
        }

        //Tạo List các năm làm việc
        public static void getListNam()
        {
            if (Global_Var.nam.Count == 0)
                for (byte i = 0; i < DateTime.Today.Year - 2005; i++)
                    Global_Var.nam.Add((DateTime.Today.Year - i).ToString());
        }

        //Hiện các cột của DataGridView trong danh sách các cột được chỉ định.
        public static void DataGridViewFormat(DataGridView DataGridViewName, string[] columns)
        {
            foreach (DataGridViewColumn cl in DataGridViewName.Columns)
            {
                if (!columns.Contains(cl.Name))
                    cl.Visible = false;
            }
        }

        //Kiểm tra giá trị khóa chính của một bảng.
        public static bool checkPriKey(string tableName, int len, string[] key, object[] value)
        {
            DataAccessHelper db = new DataAccessHelper();
            string where = null;
            for (int i = 0; i < len; i++)
            {
                where += key[i] + " = " + value[i] + " and ";
            }

            where = where.Substring(0, where.Length - 5);

            object c = db.GetVaule(string.Format("Select * From {0} Where {1}", tableName, where));

            if (c != null)
                return true;
            else return false;
        }

        //Kiểm tra khóa chính của các bảng có chứa khóa kiểu date
        public static bool checkPriKey_Date(string tableName, int len, string[] key, object[] value, string dateColumn, string dateValue)
        {
            DataAccessHelper db = new DataAccessHelper();
            string where = null;
            for (int i = 0; i < len; i++)
            {
                where += key[i] + " = " + value[i] + " and ";
            }

            where += dateColumn + " = Convert (date, '" + dateValue + "')";

            object c = db.GetVaule(string.Format("Select * From {0} Where {1}", tableName, where));

            if (c != null)
                return true;
            else return false;
        }

        //Kiểm tra tính hợp lệ của số ngày nghỉ bảo hiểm và số ngày nghỉ không lương của nhân viê trong tháng.
        public static bool check_SoNgay(string soNgay)
        {
            soNgay = soNgay.Trim();
            if (soNgay == "")
            {
                MessageBox.Show("Vui lòng nhập số ngày nghỉ!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            try
            {
                sbyte sn = Convert.ToSByte(soNgay);


                if (sn <= 0)
                {
                    MessageBox.Show("Số ngày nghỉ phải lớn hơn 0!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }

                if (sn > 26)
                {
                    MessageBox.Show("Số ngày nghỉ không được lớn hơn số ngày làm theo quy định (26 ngày)!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }
            catch (FormatException)
            {
                MessageBox.Show("Số ngày nghỉ chỉ được nhập 'Số'!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            catch (OverflowException)
            {
                MessageBox.Show("Số ngày nghỉ không được lớn hơn số ngày làm theo quy định (26 ngày)!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        public static bool check_SoGio(string soGio)
        {
            soGio = soGio.Trim();
            if (soGio == "")
            {
                MessageBox.Show("Vui lòng nhập số giờ làm thêm!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            try
            {
                sbyte sg = Convert.ToSByte(soGio);


                if (sg <= 0)
                {
                    MessageBox.Show("Số giờ phải lớn hơn 0!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }

                if (sg > 8)
                {
                    MessageBox.Show("Số giờ không được lớn hơn 8!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }
            catch (FormatException)
            {
                MessageBox.Show("Số giờ nghỉ chỉ được nhập 'Số'!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            catch (OverflowException)
            {
                MessageBox.Show("Số giờ không được lớn hơn 8!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        //Định dạng HeaderText, ReadOnly, Frozen, Width cho 1 Column trong DataGridView.
        public static void FormatDataGridViewColumn(DataGridView dataGridViewName, byte no_Column, string headerText, bool readOnly, int width, bool frozen)
        {
            dataGridViewName.Columns[no_Column].HeaderText = headerText;
            dataGridViewName.Columns[no_Column].ReadOnly = readOnly;
            //dataGridViewName.Columns[noColumn].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dataGridViewName.Columns[no_Column].Width = width;
            dataGridViewName.Columns[no_Column].Frozen = frozen;
        }

        //Đánh số thứ tự cho các dòng trong DataGridView
        public static void autoNumber(DataGridView dataGridViewName, string columnName, DataGridViewRowPrePaintEventArgs e)
        {
            dataGridViewName.Rows[e.RowIndex].Cells[columnName].Value = e.RowIndex + 1;
        }

        //Kiểm tra xem tháng nhập liệu có lớn hơn tháng hiện tại không
        public static bool checkMonthYear(byte month, int year)
        {
            if (year > DateTime.Today.Year)
            {
                MessageBox.Show("Năm được chọn lớn hơn năm hiện tại!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return false;
            }
            else if (year == DateTime.Today.Year && month > DateTime.Today.Month)
            {
                MessageBox.Show("Tháng, năm được chọn lớn hơn tháng, năm hiện tại!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return false;
            }
            return true;
        }

        public static bool checkDayMonthYear(byte day, byte month, int year)
        {
            if (year > DateTime.Today.Year)
            {
                MessageBox.Show("Năm được chọn lớn hơn năm hiện tại!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return false;
            }
            else if (year == DateTime.Today.Year && month > DateTime.Today.Month)
            {
                MessageBox.Show("Tháng năm  được chọn lớn hơn tháng, năm hiện tại!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return false;
            }
            else if (year == DateTime.Today.Year && month == DateTime.Today.Month && day > DateTime.Now.Day)
            {
                MessageBox.Show("Ngày tháng năm được chọn lớn hơn ngày tháng năm hiện tại!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);

                return false;
            }
            return true;
        }

        //Load ngày trong tháng vào combo box Ngày.
        public static void LoadNgay(ComboBox comboBox, string month, string year)
        {
            month = month.Trim();
            year = year.Trim();

            switch (month)
            {
                case "1":
                case "3":
                case "5":
                case "7":
                case "8":
                case "10":
                case "12":
                    comboBox.DataSource = Global_Var.ngay31;
                    break;
                case "4":
                case "6":
                case "9":
                case "11":
                    comboBox.DataSource = Global_Var.ngay30;
                    break;
                case "2":
                    if (Convert.ToInt32(year) % 4 == 0) comboBox.DataSource = Global_Var.ngay29;
                    else comboBox.DataSource = Global_Var.ngay28;
                    break;
            }
        }

        //Kiểm tra Form đã được mở chưa.
        public static bool ckeck_FormOpented(string childFromName)
        {
            Form frm = frmMaim.ActiveForm;
            foreach (Form f in frm.MdiChildren)
                if (f.Name == childFromName)
                {
                    f.Activate();
                    return true;
                }
            return false;
        }

        //Đóng tăt cả các childForm khi mainForm đóng
        public static void closeChildForm()
        {
            Form frm = frmMaim.ActiveForm;
            foreach (Form f in frm.MdiChildren)
                f.Close();
        }

        //Kiểm tra giá trị sản phẩm khi người dùng nhập vào GridView
        public static bool checkCellValue(DataGridView dataGirdViewName, int rowIndex, int columnIndex)
        {
            string value;
            try
            {
                value = dataGirdViewName.Rows[rowIndex].Cells[dataGirdViewName.Columns[columnIndex].Name].Value.ToString();
            }
            catch (Exception)
            {
                MessageBox.Show("Chưa nhập số sản phẩm!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            value = value.Trim();

            try
            {

                int vl = Convert.ToInt32(value);
                if (vl < 0)
                {
                    MessageBox.Show("Số sản phẩm không được nhỏ hơn 0!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }

                if (vl > 255)
                {
                    MessageBox.Show("Số sản phẩm quá lớn, vui lòng kiểm tra lại!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }

            }
            catch (FormatException)
            {
                MessageBox.Show("Số sản phẩm chỉ được nhập 'Số'!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            catch (OverflowException)
            {
                MessageBox.Show("Số sản phẩm Không đúng!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        public static bool checkCellValue_Phat(DataGridView dataGirdViewName, int rowIndex, int columnIndex)
        {
            string value;
            try
            {
                value = dataGirdViewName.Rows[rowIndex].Cells[dataGirdViewName.Columns[columnIndex].Name].Value.ToString();
            }
            catch (Exception)
            {
                MessageBox.Show("Chưa nhập số lần phạt!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            value = value.Trim();

            try
            {

                int vl = Convert.ToInt32(value);
                if (vl < 0)
                {
                    MessageBox.Show("Số lần phạt không được nhỏ hơn 0!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }

                if (vl > 255)
                {
                    MessageBox.Show("Số lần phạt quá lớn, vui lòng kiểm tra lại!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }

            }
            catch (FormatException)
            {
                MessageBox.Show("Số lần phạt chỉ được nhập 'Số'!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            catch (OverflowException)
            {
                MessageBox.Show("Số lần phạt không Không đúng!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        //Kiem tra chuyen doi sang so co duoc khong
        public static bool isNunmer(string number)
        {
            string value = number.Trim();

            try
            {
                int vl = Convert.ToInt32(value);
                if (vl < 0)
                    return false;

                else if (vl > 255)
                    return false;

            }
            catch (FormatException)
            {
                return false;
            }
            catch (OverflowException)
            {
                return false;
            }
            return true;
        }

        public static object getLCB(string thang, string nam)
        {
            DataAccessHelper db = new DataAccessHelper();

            string sql = string.Format("declare @thang tinyint, @nam int set @thang = CONVERT(tinyint, {0}) set @nam = CONVERT(int, {1}) select dbo.TimLuongCB (@thang, @nam)", thang, nam);

            return db.GetVaule(sql);
        }

        public static bool check_ConvertDate(string date)
        {
            try
            {
                date = date.Trim();
                Convert.ToDateTime(date);
                return true;
            }
            catch (Exception e)
            {
                return false;
            }
        }
    }



}
